package model.document;

import java.util.ArrayList;

public class SectionNonVide extends Section {

	
	private ArrayList<Section> sousSections;
	
	
	public SectionNonVide(Ligne titre, Texte texteIntroductif, Section sousSection, Section sectionParente){
		super(sectionParente);
		this.setTitre(titre);
		this.setTexteIntroductif(texteIntroductif);
		ArrayList<Section> list= new ArrayList<Section>();
		list.add(sousSection);
		this.setSousSections(list);
	}
	
	
	public SectionNonVide() {
		super();
		this.sousSections=new ArrayList<Section>();
	}


	public ArrayList<Section> getSousSections() {
		return sousSections;
	}

	public void setSousSections(ArrayList<Section> sousSections) {
		this.sousSections = sousSections;
	}
	
	//?
	public void addSousSection(Section sec, int position){
		this.sousSections.add(position, sec);
		sec.setSectionParente(this);
	}
	
	
	@Override
	public String toString() {
		//Generation de l'indentation
		String indent = "";
		for(int i=0;i<this.getIndentation();i++){
			indent+="*";
		}
		if(isDeplie()){
			// chaine complete
			return indent + this.getTitre().toString() + '\n' + this.getTexteIntroductif().toString() + this.getSousSections().toString();
		} else {
			//Chaine reduite a l'indentation au titre et des points de suspensions
			return indent + this.getTitre().toString()  + " ...\n";
		}
	}

	@Override
	public Section getSousSection(int i) {
		return this.getSousSections().get(i);
	}

	@Override
	public int getSize() {
		if(this.isDeplie()){
			int sizeSousSections = 0;
			//parcours des sous-sections pour obtenir leur taille
			for( Section s : this.getSousSections()){
				sizeSousSections += s.getSize();
			}
			//la taille de la section est la taille du titre, de son texte et de ses sous-sections
			return this.getTitre().getSize() + this.getTexteIntroductif().getSize() + sizeSousSections;
		} else{
			//si la section est pliee, sa taille est reduite a celle de sont titre
			return this.getTitre().getSize();
		}
	}

	@Override
	public Ligne getLigne(int numLigne) {
		//si la ligne fais partie du titre ou du texte introductif
		if(this.getTitre().getSize() + this.getTexteIntroductif().getSize() >= numLigne){
			if(this.getTitre().getSize() >= numLigne){
				return this.getTitre();
			}
			return this.getTexteIntroductif().getLigne(numLigne-this.getTitre().getSize());
		}
		else {
			//sinon on  recherche parmi les sous-sections
			boolean trouve = false;
			int i = this.getTitre().getSize() + this.getTexteIntroductif().getSize();
			int k = 0;
			do{
				//Si la taille de la sous-section k sommee aux lignes deja parcourues dans la section
				//, alors on a trouve la section dans laquelle se situe la ligne recherchee
				trouve = ((this.getSousSection(k).getSize() + i) >= numLigne);
				if(!trouve){
					//Si la section n'est pas trouvee, on passe a la section suivante et l'on actualise le nombre de lignes parcourues
					i += this.getSousSection(k).getSize();
					k++;
				}
			}while(!trouve && k<this.getSousSections().size());
			//on delegue la recherche de la ligne a la sous-section la contenant
			return this.getSousSection(k).getLigne(numLigne-i);
		}
	}


	@Override
	public void remove(Section section) {
			this.getSousSections().remove(section);
	}
	

}